#include "quickjs-libc.h"
#include "quickjs.h"
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>

using namespace std;

static int fib(int n);
static JSValue js_fib(JSContext *ctx, JSValueConst this_val, int argc,
                      JSValueConst *argv);

static const JSCFunctionListEntry js_fib_funcs[] = {
    JS_CFUNC_DEF("fib", 1, js_fib),
};

#define countof(x) (sizeof(x) / sizeof((x)[0]))

typedef struct {
  int x;
  int y;
} JSPointData;

static JSClassID js_point_class_id;

static void js_point_finalizer(JSRuntime *rt, JSValue val);
static JSValue js_point_ctor(JSContext *ctx, JSValueConst new_target, int argc,
                             JSValueConst *argv);
static JSValue js_point_get_xy(JSContext *ctx, JSValueConst this_val,
                               int magic);
static JSValue js_point_set_xy(JSContext *ctx, JSValueConst this_val,
                               JSValue val, int magic);
static JSValue js_point_norm(JSContext *ctx, JSValueConst this_val, int argc,
                             JSValueConst *argv);
static JSClassDef js_point_class = {
    "Point",
    .finalizer = js_point_finalizer,
};
static const JSCFunctionListEntry js_point_proto_funcs[] = {
  JS_CGETSET_MAGIC_DEF("x", js_point_get_xy, js_point_set_xy, 0),
  JS_CGETSET_MAGIC_DEF("y", js_point_get_xy, js_point_set_xy, 1),
  JS_CFUNC_DEF("norm", 0, js_point_norm),
};

